package com.hzit.dao.proxy.dyna;

import com.hzit.dao.UserDao;
import com.hzit.dao.impl.UserDaoImpl;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 类名：
 * 作者：WF
 * 功能：JDK动态代理实现，通过实现接口的方式创建代理对象
 */
public class UserDaoJDKDynaImpl implements InvocationHandler {

	//1. 引入目标对象
	private UserDao userDao;
	public UserDaoJDKDynaImpl(){
		userDao = new UserDaoImpl();
	}
	//2. 生成一个代理对象
	public UserDao createProxy(){
		// 下面的newProxyInstance()方法中的三个参数如下：
		// 参数1：当前类的类加载器对象
		// 参数2：目标对象所实现的接口类型数组
		// 参数3：实现了InvocationHandler接口的对象
		return (UserDao) Proxy.newProxyInstance(this.getClass().getClassLoader(),
				userDao.getClass().getInterfaces(),this);
	}
	//3. 主要用于调用目标对象的相关方法
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		if(method.getName().equals("query")){   // 如果是query方法就进行安全性检查
			checkSecurity();
		}
		Object res = method.invoke(userDao, args);
		return res;
	}
	private void checkSecurity(){
		System.out.println("JDK动态代理正在进行安全性检查。。。");
	}
}
